Skip to main content

09 线程

为什么要有线程

即便不主动创建线程,每个进程也会默认有一个主线程。

进程除了执行指令,还要管理内存、文件系统等,线程只负责执行二进制指令。

进程并行执行的问题:

  1. 创建进程占用资源太多;
  2. 进程之间的通信需要数据在不同的内存空间传来传去,无法共享。

将前台的任务和后台的任务分开,两个任务在不同的线程处理,以保证互不耽误。

创建线程

调用 pthread_create 创建线程,第一个参数是线程对象,第二个参数是线程的属性,第三个参数是线程运行函数,第四个参数是线程运行函数的参数。调用 pthread_exit 退出线程。

线程的数据

线程栈上的本地数据

函数执行过程中的局部变量。

主线程在内存中有一个栈空间,其他线程栈也拥有独立的栈空间。

在整个进程里共享的全局数据

全局变量在一个进程中是共享的。

线程私有数据

int pthread_key_create(pthread_key_t *key, void (*destructor)(void*))

key 一旦被创建,所有线程都可以访问,但各线程可根据自己的需要往 key 中填入不同的值,即提供了一个同名而不同值的全局变量。

数据的保护

Mutex 互斥锁

互斥(Mutual Exclusion),在共享数据访问的时候,去申请加把锁,谁先拿到锁,谁就拿到了访问权限,等访问结束把锁打开,其他人再去争夺。

条件变量(通知)